CognitoユーザーのIDトークンを取得するスクリプトを書いてみた(AWS SDK for JavaScript v3)
こんにちは、CX事業本部 IoT事業部の若槻です。
以前、Amazon Cognito上のユーザーのIDトークンを取得するヘルパースクリプトを紹介しました。
しかしこの時に使用したAWS SDK for JavaScriptはv2だったため、最新のv3よりも1世代前となっています。
そこで今回は、AWS SDK for JavaScript v3を使用して、CognitoユーザーのIDトークンを取得するスクリプトをリメイクしてみました。
やってみた
前提
次の環境を使用します。
- typescript@3.9.10
- ts-node@9.1.1
またこちらは作成済みとします。
- Cognito User Pool
- Cognito User Pool Cliant App
- Cognito User Pool上のユーザー
準備
AWS SDK for JavaScript v3はサービス毎にパッケージが分かれています。ユーザーのIDトークンを取得できるAdminInitiateAuth APIを使用したい場合は次のCognito Identity Provider Clientを使用します。
パッケージをインストールします。
$ npm install @aws-sdk/client-cognito-identity-provider # .envから環境変数を設定できる $ npm i -D dotenv dotenv-cli
.env
ファイルにCognito User Poolの情報を記載します。
USER_POOL_ID="ap-northeast-1_XXXXXXXXX" COGNITO_CLIENT_ID="xxxxxxxxxxxxxxxxxxxxxxx"
package.json
のscripts
に今回作成するスクリプトの実行コマンドを記載します。
{ "scripts": { "get-my-user-id-token": "dotenv -e .env -- ./node_modules/.bin/ts-node ./get-cognito-my-user-id-token-helper.ts" } }
スクリプト
AdminInitiateAuth APIを使用してトークン情報を取得し、IDトークンを標準出力するようにしています。
import { CognitoIdentityProviderClient, AdminInitiateAuthCommand, AdminInitiateAuthCommandInput, } from '@aws-sdk/client-cognito-identity-provider'; const COGNITO_API_VERSION = '2016-04-18'; const REGION = 'ap-northeast-1'; const COGNITO_USER_POOL_ID = process.env.USER_POOL_ID!; const COGNITO_CLIENT_ID = process.env.COGNITO_CLIENT_ID!; const MY_USERNAME = process.env.MY_USERNAME!; const MY_PASSWORD = process.env.MY_PASSWORD!; const client = new CognitoIdentityProviderClient({ apiVersion: COGNITO_API_VERSION, region: REGION, }); /** * IDトークンを取得 */ const getIdToken = async (): Promise<void> => { const params: AdminInitiateAuthCommandInput = { UserPoolId: COGNITO_USER_POOL_ID, ClientId: COGNITO_CLIENT_ID, AuthFlow: 'ADMIN_USER_PASSWORD_AUTH', AuthParameters: { USERNAME: MY_USERNAME, PASSWORD: MY_PASSWORD, }, }; const response = await client.send(new AdminInitiateAuthCommand(params)); const idToken = response.AuthenticationResult?.IdToken!; console.log(`ID_TOKEN="${idToken}"`); }; getIdToken();
v3はやはり作成したCommandをSendする書き方となるのが特徴的ですね。
動作
Cognitoユーザーのユーザー名とパスワードを環境変数で指定します。
$ export MY_USERNAME=XXXXXXXXX $ export MY_PASSWORD=YYYYYYYYYYYY
スクリプトを実行します。するとコンソールにID_TOKEN="<IDトークン>"
と出力され、IDトークンを取得できました!
$ npm run get-my-user-id-token > aws-cdk-v2-project@0.1.0 get-my-user-id-token > dotenv -e .env -- ./node_modules/.bin/ts-node ./get-cognito-my-user-id-token-helper.ts ID_TOKEN="eyJraWQiOiJQZWlVNlpAxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
あとはこれをexport
したり、.env
ファイルに記載するなりすれば、他の処理(Cognito認証を伴うE2Eテストなど)でも利用できるようになります!
注意点
スクリプトをローカルで実行しようとしたため、今回もこちらに引っかかりました…。認証をAssumeRoleで行う際は忘れずにunset AWS_PROFILE
をしましょう。
おわりに
AWS SDK for JavaScript v3を使用して、CognitoユーザーのIDトークンを取得するスクリプトをリメイクしてみました。
以前のスクリプトはCognitoユーザーの認証を伴うE2Eテストの実行などでたまに使っていたのですが、v3にアップデートできずv2のまま使っちゃっていたので、今回リメイクできて良かったです。今後はこちらを使っていこうと思います。
以上